// permission.js文件其实就是路由导航守卫的抽离的单独的模块, 后期自己写
// 路由导航守卫(路由钩子)
import router from '@/router'
import store from '@/store'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
// import { asyncRoutes } from '@/router'

// function filterRoutes() {}

// to 和 from 是 路由信息对象
// next('/') 等价于 this.$router.push('/')
// this.$router.push({path: '/', query: {a: 10}})
// next({path: '/', query: {a: 10}})
const whiteList = ['/login', '/404']
// 前置导航守卫
router.beforeEach(async(to, from, next) => {
  // console.log(to)
  nprogress.start() // 开启进度条
  const token = store.getters.token // 一定放在导航守卫内获取
  // 1. 先判断是否有token, 如果有token,还要去登录页面, 强制去首页
  if (token) {
    if (to.path === '/login') {
      next('/') // 被next强制拦截的页面是不会进入到后置导航守卫中的,需要手动关闭进度条
      nprogress.done()
      // 2. 登录后, 获取到个人信息后想去哪就去哪(权限系统)
    } else {
      // 权限系统: 目前的情况  登录成功后 => 跳转到了首页 => 在首页的某个组件内才获取的个人信息(个人信息中是包含权限信息的 5条) 有些晚
      // 改造的结果  登录成功后=> 在进入首页之前获取到用户信息(个人信息中是包含权限, 有几条权限展示几条链接) =>进入系统首页
      // 在放行之前 获取用户个人信息
      if (!store.getters.name) {
        const res = await store.dispatch('user/getUserInfo') // 挖坑---权限功能 个人信息中roles.menus是当前用户的权限列表
        console.log(res, 8888)
        // 这里需要添加用户对应的路由规则 addRoutes
        // 正常情况下, 应该是基于menus去asyncRoutes中过滤几个出来 addRoutes
        // 临时: 先给我把8个动态路由全加了

        // 这里要过滤路由规则 8 => 3
        // 封装一个方法
        // 必须给两个参数asyncRoutes menus
        // return 出来我自己的规则
        const res2 = await store.dispatch('permission/filterRoutes', res.roles.menus)
        console.log(res2, 7766)

        // 动态添加路由规则是异步的, 8个路由规则不会立刻生效!
        router.addRoutes([...res2, { path: '*', redirect: '/404', hidden: true }])
        // router.addRoutes([{ path: '*', redirect: '/404', hidden: true }])

        // 为了保证路由规则生效后 才放行, 有个经典的操作 回首掏
        // next({ path: '/login', query: {} })
        next({
          // path: to.path,
          // query: to.query,
          // params: to.params
          ...to,
          replace: true // 避免历史路由重复的问题
        }) // 以原来的"姿势"重进一次页面
        return
      }
      // console.log("获取个人信息成功后放行");
      next()
    }
  } else {
    // 3. 没有登录的情况,且去的是白名单页面, 直接放行
    // if(whiteList.indexOf(to.path) !== -1) {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      // 没有登录访问有权限的页面 强制去登录
      next('/login')
      nprogress.done() // 被next强制拦截的页面是不会进入到后置导航守卫中的,需要手动关闭进度条
    }
  }
})
// 后置导航守卫
router.afterEach((to, from) => {
  // 关闭进度条
  nprogress.done()
})
